package Test;

import java.util.Date;

import junit.framework.TestCase;

import CtrLayer.ButikCtr;
import CtrLayer.OrdreCtr;
import CtrLayer.ProduktCtr;
import DataLayer.DB.DBKunde;
import DataLayer.DB.DBProdukt;
import DataLayer.Model.Kunde;
import DataLayer.Model.Ordre;
import DataLayer.Model.Ordre.OrdreStatus;
import DataLayer.Model.Produkt;

public class testButikCtr extends TestCase
{
	public ButikCtr bCtr;
	public ProduktCtr pCtr;
	public Produkt produkt1;
	public Produkt produkt2;
	private Kunde kunde;
	private OrdreCtr oCtr;
	private Ordre ordre;

	public void setUp() throws Exception
	{
		bCtr = ButikCtr.getInstance();
		pCtr = new ProduktCtr();
		oCtr = new OrdreCtr();
		DBProdukt dbP = new DBProdukt();
		produkt1 = new Produkt("40K Test", "Stor tank", true, 250, true);
		produkt2 = new Produkt("40K Test", "Star tank", true, 350, true);
		dbP.insertProdukt(produkt1);
		dbP.insertProdukt(produkt2);
		// Find the products
		for (Produkt p : pCtr.getAllProdukt(true))
		{
			if(produkt1.getModel().equals(p.getModel()))
			{
				 produkt1.setProduktId(p.getProduktId());
			}
			if(produkt2.getModel().equals(p.getModel()))
			{
				 produkt2.setProduktId(p.getProduktId());
			}
		}
		DBKunde dbK = new DBKunde();
		kunde = new Kunde("Test", "User", "Testroad", "9000", "Aalborg", "38", "99886644", "user@test.test", false, new Date().getTime(), true);
		dbK.insertKunde(kunde);
		kunde = dbK.getKundeViaEmail(kunde.getEmail());
	}

	public void tearDown() throws Exception
	{
		bCtr = null;
		pCtr = null;
		oCtr.removeOrdre(ordre.getOrdreId());
		oCtr = null;
		DBProdukt dbP = new DBProdukt();
		for (Produkt p : dbP.searchProduktViaType("40K Test", true))
		{
			dbP.deleteProdukt(p.getProduktId());
		}
		produkt1 = null;
		produkt2 = null;
		DBKunde dbK = new DBKunde();
		dbK.deleteKunde(kunde);
	}
	// Normal use-case scenario
	public void testStartButikOrdre()
	{
		// 1
		bCtr.startButikOrdre();
		// 2
		bCtr.addProdukt(1, produkt1);
		// 3
		assertEquals(250.0, bCtr.getOrdre().getTotal());
		// 4
		bCtr.addProdukt(1, produkt2);
		assertEquals(600.0, bCtr.getOrdre().getTotal());
		long leveringsDato = new Date().getTime();
		bCtr.getOrdre().setLeveringsDato(leveringsDato);
		// 6
		bCtr.setButikOrdreKunde(kunde.getKundeId());
		// 8
		assertEquals(kunde.getFornavn(), bCtr.getOrdre().getKunde().getFornavn());
		// 9
		try
		{
			bCtr.commitButikOrdre();
		}
		catch (Exception e)
		{
			System.out.println("Order was not created");
			e.printStackTrace();
		}
		// part 10 and 11 skipped
		
		// 12
		for (Ordre o : oCtr.getAllOrdreViaKundeEmail(kunde.getEmail()))
		{
			ordre = o;
		}
		ordre.setDebit(250.0);
		// 13
		ordre.setOrdreStatus(OrdreStatus.ACTIVE);
		oCtr.updateOrdre(ordre);
		// 15-17
		ordre.setDebit(600.0);
		ordre.setOrdreStatus(OrdreStatus.ENDED);
		oCtr.updateOrdre(ordre);
	}
}
